package service

import (
	"fmt"
	"os/exec"
	"path/filepath"

	"gitee.com/InsignificantDust/msrv/files"
)

type defaultService struct {
	// 服务名称
	srvName string
	// cmdType
	srvLang string
	// 命令参数
	cmdArgs string
	// 完整包名,不含路径
	pkgName string
	// 工作目录
	workDir string
	// 服务包目录
	pkgDir string
	// 源包目录
	pkgSourceDir string
	// 备份目录
	backupDir string
	// 源配置文件目录
	srcConfigDir string
	// 配置文件目录
	configDir string
	// PidFile
	pidFile string
	// 健康检查url
	healthUrl string
	// 服务启动程序命令
	runCmd string
	// 服务启动超时时间
	startTimeout int
	// 文件后缀
	pkgPostfix string
	// 备份后缀
	bakPostfix string
	// 包来源
	pkgFrom string
	// 如果需要下载时请提供下载url, 从本地为空字符串
	pkgUrl string
	// 服务描述信息
	description string
}

func (j *defaultService) SrvName() string {
	return j.srvName
}

func (j *defaultService) Start() error {
	return nil
}

func (j *defaultService) Stop() error {
	return nil
}

func (j *defaultService) Restart() error {
	return nil
}

func (j *defaultService) Deploy() error {
	return nil
}

func (j *defaultService) Status() bool {
	return true
}

func (j *defaultService) Rollback(updateConfig bool) error {
	return nil
}

func (j *defaultService) Update(updateConfig bool) error {
	return nil
}

// 备份服务
func (j *defaultService) backup(updateConfig bool) error {
	return nil
}

func (j *defaultService) Uninstall() error {
	return nil
}

func (j *defaultService) GetCmd() (string, error) {
	if filepath.IsAbs(j.runCmd) && files.IsExist(j.runCmd) && files.IsExecutable(j.runCmd) {
		return j.runCmd, nil
	}
	cmdPath, err := exec.LookPath(j.runCmd)
	if cmdPath != "" {
		return cmdPath, nil
	}
	return "", err
}

func (j *defaultService) Validate() bool {
	return false
}

func (j *defaultService) Describ() string {
	sourcePkg := filepath.Join(j.pkgSourceDir, j.pkgName)
	descStr := fmt.Sprintf("%s服务由%s编写而成，源码包为: %s,工作目录：%s ,配置目录：%s\n", j.srvName, j.srvLang, sourcePkg, j.workDir, j.configDir)
	return descStr
}
